package com.miracle.设计模式.创建型模式.单例模式;

/**
 * 1.懒汉模式
 * 该模式的特点是类加载时没有生成单例，只有当第一次调用 getlnstance 方法时才去创建这个单例。
 * 如果编写的是多线程程序，则不要删除上例代码中的关键字 volatile 和 synchronized，否则将存在线程非安全的问题。
 * 如果删除这两个关键字就不能保证线程安全，但是每次访问时都要同步，会影响性能，且消耗更多的资源，这是懒汉式单例的缺点。
 */
class LazySingleton {
    private static volatile LazySingleton instance = null; // 保证instance在所有线程中同步

    private LazySingleton() {
    } //私有化构造方法，避免在外部被实例化

    //1.普通写法
    public static synchronized LazySingleton getInstance() {
        //getInstance方法前加同步
        if (instance == null) {
            return new LazySingleton();
        }
        return instance;
    }

    //2.双重校验锁定
    public static LazySingleton getInstance1() {
        if (instance==null){
            synchronized (LazySingleton.class){
                if (instance==null){
                    return new LazySingleton();
                }
            }
        }
        return instance;
    }

    // 静态内部类
    // 这种比上面1、2都好一些，既实现了线程安全，又避免了同步带来的性能影响。
    private static class LazyHolder{
        private static final LazySingleton INSTANCE = new LazySingleton();
    }
    public static final LazySingleton getInstance3(){
        return LazyHolder.INSTANCE;
    }

}
